/*
 * @(#)XfspPruneSimplifier.java        2004/08/01
 *
 * This file is part of Xfuzzy 3.1, a design environment for fuzzy logic
 * based systems.
 *
 * (c) 2000 IMSE-CNM. The authors may be contacted by the email address:
 *                    xfuzzy-team@imse.cnm.es
 *
 * Xfuzzy is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by
 * the Free Software Foundation.
 *
 * Xfuzzy is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 */

package xfuzzy.xfsp.model.rulebases;

import xfuzzy.lang.KnowledgeBase;
import xfuzzy.lang.Specification;
import xfuzzy.lang.SystemModule;

/**
 * <p> <b>Descripci�n:</b> clase de objetos que permiten el podado de bases de
 * reglas en funci�n del grado de activaci�n m�ximo de las reglas que la
 * componen.
 * <p> <b>E-mail</b>: <ADDRESS>joragupra@us.es</ADDRRESS>
 * @author Jorge Agudo Praena
 * @version 1.4
 * @see IXfspRulebaseSimplifier
 * @see XfspModel
 * @see XfspPrunning
 *
 */
public abstract class XfspPruneSimplifier
    implements IXfspRulebaseSimplifier {

  //patr�n de entrada que permite evaluar el grado de activaci�n de la base de
  //reglas
  protected double[][] pattern;

  /**
   * <p> <b>Descripci�n:</b> crea un simplificador de bases de reglas de
   * sistemas difusos por podado de las reglas.
   * @param pattern Patr�n de datos para las entradas de las reglas.
   *
   */
  public XfspPruneSimplifier(double[][] pattern) {
    //establece los datos que se utilizar�n para activar las entradas de la
    //base de reglas a podar
    this.pattern = pattern;
  }

  /**
   * <p> <b>Descripci�n:</b> simplifica una base de reglas de un sistem difuso
   * cuya especificaci�n tambi�n es proporcionada por podado de algunas de sus
   * reglas.
   * @param rulebase Base de reglas que se quiere simplificar.
   * @param spec Especificaci�n del sistema cuya base de reglas se va a
   * simplificar.
   *
   */
  public void simplify(KnowledgeBase rulebase, Specification spec) {
    //calcula el grado de activaci�n m�ximo de las reglas del sistema
    computeMaxActivation(spec);
    //poda la base de reglas elegida
    prune(rulebase);
  }

  /**
   * <p> <b>Descripci�n:</b> hace el podado de una base de reglas.
   * @param rulebase Base de reglas que se quiere podar.
   *
   */
  protected abstract void prune(KnowledgeBase rulebase);

  /**
   * <p> <b>Descripci�n:</b> calcula el grado de activaci�n m�ximo de las
   * reglas de un sistema difuso seg�n un patr�n de datos para las entradas.
   * @param spec Especificaci�n del sistema cuyas entradas se van a estimular.
   *
   */
  protected void computeMaxActivation(Specification spec) {
    SystemModule system = spec.getSystemModule();
    //obtiene las bases de reglas del sistema
    KnowledgeBase[] rulebases = spec.getRulebases();
    //para cada base de reglas del sistema...
    for (int i = 0; i < rulebases.length; i++) {
      //...pone a cero el grado de activaci�n m�ximo de sus reglas
      rulebases[i].resetMaxActivation();
    }
    //para cada uno de los datos que servir�n de entrada...
    for (int p = 0; p < pattern.length; p++) {
      //...calcula el grado de activaci�n m�ximo de las reglas del sistema
      system.fuzzyInference(pattern[p]);
    }
  }
}
